﻿#pragma once

#ifdef OPLUSWRAPPERAPI_EXPORTS
#define OPLUSWRAPPERAPI_EXPORT extern "C" __declspec(dllexport)
#else
#define OPLUSWRAPPERAPI_EXPORT extern "C" __declspec(dllimport)
#endif // OPLUSWRAPPERAPI_EXPORTS

// 回报订阅方式
// 从订阅之后推送
#define REPORT_SUBSCRIBE_TYPE_QUICK		"0"
// 从上次断线后续传
#define REPORT_SUBSCRIBE_TYPE_RESUME	"1"
// 不订阅
#define REPORT_SUBSCRIBE_TYPE_NO	"2"

// 交易所
#define MARKET_STOCK_SH "1"
#define MARKET_STOCK_SZ "2"
#define MARKET_STOCK_BJ "10"
#define MARKET_FUTURES_CZC "4"
#define MARKET_FUTURES_DCE "9"
#define MARKET_FUTURES_SHF "3"
#define MARKET_FUTURES_CFE "7"
#define MARKET_FUTURES_INE "k"
#define MARKET_FUTURES_GFE "107"

// 买卖方向
// 股票，ETF，期货，期权
#define DIRECTION_BUY "1"
#define DIRECTION_SELL "2"
// 债券
#define DIRECTION_BOND_BUY "3"
#define DIRECTION_BOND_SELL "4"

// 开平方向
#define OFFSET_FLAG_OPEN "1"
#define OFFSET_FLAG_CLOSE "2"

// 期权类型
#define OPTION_TYPE_CALL "C"
#define OPTION_TYPE_PUT "P"

// 平仓类型，上期所有效
// 优先平今
#define CLOSE_TYPE_DEFAULT "0"
// 平今仓
#define CLOSE_TYPE_TODAY "1"
// 平老仓
#define CLOSE_TYPE_HISTORY "2"

// 价格类型
// 限价
#define PRICE_TYPE_LIMIT "0"
// 期货市价
#define PRICE_TYPE_FUTURES_MARKET "1"
// 全额成或撤(FOK限价)（上期所、中金所、深交所、能源交易所）
#define PRICE_TYPE_FUTURES_FOK "G"
// 即成剩撤（FAK）（上期所、郑商所、中金所、能源交易所）
#define PRICE_TYPE_FUTURES_FAK "K"

// 报单状态
// 未报
#define ORDER_STATUS_NONE "1"
// 待报
#define ORDER_STATUS_WAITING "2"
// 正报
#define ORDER_STATUS_REPORTING "3"
// 已报
#define ORDER_STATUS_REPORTED "4"
// 废单
#define ORDER_STATUS_DISCARDED "5"
// 部成
#define ORDER_STATUS_PARTIAL_TRADED "6"
// 已成
#define ORDER_STATUS_ALL_TRADED "7"
// 部撤
#define ORDER_STATUS_PARTIAL_CANCELED "8"
// 已撤
#define ORDER_STATUS_ALL_CANCELED "9"
// 待撤，撤单下达之后，且撤单未成功也未失败时的状态
#define ORDER_STATUS_WAITING_CANCEL "a"

// 撤单状态
// 未撤
#define CANCEL_ORDER_STATUS_NONE "A"
// 待撤
#define CANCEL_ORDER_STATUS_WAITING "B"
// 正撤
#define CANCEL_ORDER_STATUS_REPORTING "C"
// 撤认，撤单已经报送成功
#define CANCEL_ORDER_STATUS_REPORTED "D"
// 撤废
#define CANCEL_ORDER_STATUS_DISCARDED "E"
// 已撤
#define CANCEL_ORDER_STATUS_CANCELED "F"

// 多空标志
// 多头  期权权利仓
#define POSITION_FLAG_LONG "1"
// 空头  期权义务仓
#define POSITION_FLAG_SHORT "2"
// 期权备兑空仓
#define POSITION_FLAG_COVERED "b"

#pragma pack(push)
#pragma pack(8)
// 行情
struct Tick
{
	///交易日
	int trading_day;
	///交易所
	char market_no[11];
	///代码
	char code[32];
	///最新价
	double last_price;
	///上次结算价
	double pre_settlement_price;
	///昨收盘
	double pre_close_price;
	///昨持仓量
	int	pre_open_interest;
	///今开盘
	double open_price;
	///最高价
	double highest_price;
	///最低价
	double lowest_price;
	///数量
	long long int volume;
	///成交金额
	double turnover;
	///持仓量
	int	open_interest;
	///今收盘
	double close_price;
	///本次结算价
	double settlement_price;
	///涨停板价
	double upper_limit_price;
	///跌停板价
	double lower_limit_price;
	///最后修改时间
	char update_time[13];
	///申买价一
	double bid_price1;
	///申买量一
	int	bid_volume1;
	///申卖价一
	double ask_price1;
	///申卖量一
	int	ask_volume1;
	///申买价二
	double bid_price2;
	///申买量二
	int	bid_volume2;
	///申卖价二
	double ask_price2;
	///申卖量二
	int	ask_volume2;
	///申买价三
	double bid_price3;
	///申买量三
	int	bid_volume3;
	///申卖价三
	double ask_price3;
	///申卖量三
	int	ask_volume3;
	///申买价四
	double bid_price4;
	///申买量四
	int	bid_volume4;
	///申卖价四
	double ask_price4;
	///申卖量四
	int	ask_volume4;
	///申买价五
	double bid_price5;
	///申买量五
	int	bid_volume5;
	///申卖价五
	double ask_price5;
	///申卖量五
	int	ask_volume5;
	///申买价六
	double bid_price6;
	///申买量六
	int	bid_volume6;
	///申卖价六
	double ask_price6;
	///申卖量六
	int	ask_volume6;
	///申买价七
	double bid_price7;
	///申买量七
	int	bid_volume7;
	///申卖价七
	double ask_price7;
	///申卖量七
	int	ask_volume7;
	///申买价八
	double bid_price8;
	///申买量八
	int	bid_volume8;
	///申卖价八
	double ask_price8;
	///申卖量八
	int	ask_volume8;
	///申买价九
	double bid_price9;
	///申买量九
	int	bid_volume9;
	///申卖价九
	double ask_price9;
	///申卖量九
	int	ask_volume9;
	///申买价十
	double bid_price10;
	///申买量十
	int	bid_volume10;
	///申卖价十
	double ask_price10;
	///申卖量十
	int	ask_volume10;
};

struct KLine
{
	//周期
	int period;
	///交易日
	int trading_day;
	///交易所
	char market_no[11];
	///代码
	char code[32];
	//k线结束时间 包含 HHMMSS 如090000 090100 133000左闭右开[090000,090100)  [090100,090200)
	char update_time[28];
	//tick时间
	char tick_time[28];
	//今开盘
	double open_price;
	//最高价
	double highest_price;
	///最低价
	double lowest_price;
	//收盘价
	double close_price;
	//昨收价
	double pre_close_price;
	//涨停板价
	double upper_limit_price;
	//跌停板价
	double lower_limit_price;
	//涨跌
	double change;
	//涨跌幅
	double change_ratio;
	//振幅
	double amplitude;
	//均价
	double avg_price;
	//换手率
	double turnover_ratio;
	//成交金额 当根k线
	double turnover;
	//成交量 当根k线
	long long int volume;
	//成交次数（仅限股票日线数据）
	int trans_num;
	// 累计持仓量（期货专用）
	int open_interest;
	//昨日结算价（仅限期货日线数据）
	double pre_settlement;
	//结算价（仅限期货日线数据）
	double settlement;
	//历史k线标志
	bool is_history_kline;
	//k线是否完成
	bool is_kline_finish;
};

// 报单响应
struct OrderInsertResponse
{
	// 状态，0代表成功，否则为失败
	int status = 0;
	// 报单id
	int order_id = 0;
	// 委托编号，大于0说明成功
	int order_system_no = 0;
	// 失败时的错误原因
	char message[256] = { 0 };
};

// 撤单响应
struct OrderCancelResponse
{
	// 状态，0代表成功，否则为失败
	int status = 0;
	// 撤单id
	int cancel_order_id = 0;
	// 撤单委托编号，大于0说明成功
	int cancel_order_system_no = 0;
	// 失败时的错误原因
	char message[256] = { 0 };
};

// 报单回报
struct OrderReport
{
	// 委托时间
	int order_time = 0;
	// 报单id
	int order_id = 0;
	// 委托编号
	int order_system_no = 0;
	// 基金
	char fund[32] = { 0 };
	// 单元
	char unit[16] = { 0 };
	// 市场
	char market_no[11] = { 0 };
	// 代码
	char code[32] = { 0 };
	// 买卖方向
	char direction[4] = { 0 };
	// 开平方向
	char offset_flag[4] = { 0 };
	// 平仓类型
	char close_type[4] = { 0 };
	// 价格类型
	char price_type[4] = { 0 };
	// 报单价格
	double order_price = 0;
	// 报单数量
	int order_amount = 0;
	// 报单状态
	char order_status[4] = { 0 };
	// 撤单数量
	int cancel_amount = 0;
	// 总成交数量
	int total_trade_amount = 0;
	// 错误信息
	char message[256] = { 0 };
};

// 撤单回报
struct OrderCancelReport
{
	// 撤单id
	int cancel_order_id = 0;
	// 撤单委托编号
	int cancel_order_system_no = 0;
	// 撤单状态
	char cancel_order_status[4] = { 0 };
	// 错误信息
	char message[256] = { 0 };
};

// 成交回报
struct TradeReport
{
	// 报单id
	int order_id = 0;
	// 委托编号
	int order_system_no = 0;
	// 基金
	char fund[32] = { 0 };
	// 单元
	char unit[16] = { 0 };
	// 市场
	char market_no[11] = { 0 };
	// 代码
	char code[32] = { 0 };
	// 买卖方向
	char direction[4] = { 0 };
	// 开平方向
	char offset_flag[4] = { 0 };
	// 平仓类型
	char close_type[4] = { 0 };
	// 报单数量
	int order_amount = 0;
	// 报单状态
	char order_status[4] = { 0 };
	// 成交编号
	char trade_no[64] = { 0 };
	// 成交时间
	int trade_time = 0;
	// 成交数量
	int trade_amount = 0;
	// 成交价格
	double trade_price = 0;
	// 成交金额
	double trade_balance = 0;
	// 费用
	double trade_fee = 0;
	// 总成交数量
	int total_trade_amount = 0;
	// 总成交金额
	double total_trade_balance = 0;
};

// 股票持仓信息
struct StockPosition
{
	// 基金
	char fund[32];
	// 单元
	char unit[16];
	// 市场
	char market_no[11];
	// 代码
	char code[32];
	// 持仓数量
	int current_amount;
	// 可用数量;
	int enable_amount;
	// 买挂单数量
	int pre_buy_amount;
	// 卖挂单数量
	int pre_sell_amount;
	// 当日买入数量
	int today_buy_amount;
	// 当日卖出数量
	int today_sell_amount;
	// 当日买入金额
	double today_buy_balance;
	// 当日卖出金额
	double today_sell_balance;
};

// 股票报单信息
struct StockOrder
{
	// 基金
	char fund[32];
	// 单元
	char unit[16];
	// 市场
	char market_no[11];
	// 代码
	char code[32];
	// 交易日
	int trading_day;
	// 报单时间
	int order_time;
	// 委托编号
	int order_system_no;
	// 报单id
	int order_id;
	// 买卖方向
	char direction[4];
	// 价格类型
	char price_type[4];
	// 报单价格
	double order_price;
	// 报单数量
	int order_amount;
	// 报单状态
	char order_status[4];
	// 冻结金额
	double frozen_balance;
	// 总成交数量
	int total_trade_amount;
	// 成交价格
	double trade_price;
	// 成交金额
	double trade_balance;
	// 撤单数量
	int cancel_amount;
	// 撤单原因
	char cancel_message[256];
};

// 股票成交信息
struct StockTrade
{
	// 基金
	char fund[32];
	// 单元
	char unit[16];
	// 市场
	char market_no[11];
	// 代码
	char code[32];
	// 委托编号
	int order_system_no;
	// 报单id
	int order_id;
	// 买卖方向
	char direction[4];
	// 成交编号
	char trade_no[64];
	// 成交时间
	int trade_time;
	// 成交数量
	int trade_amount;
	// 成交价格
	double trade_price;
	// 成交金额
	double trade_balance;
	// 费用
	double trade_fee;
};

// 股票资金信息
struct StockAsset
{
	// 基金
	char fund[32];
	// 单元
	char unit[16];
	// 当前权益
	double current_equity;
	// t0可用
	double enable_balance_t0;
	// t1可用
	double enable_balance_t1;
	// 股票资产
	double stock_asset;
	// 债券资产
	double bond_asset;
	// 基金资产
	double fund_asset;
	// 回购资产
	double repo_asset;
};

// 期货持仓信息
struct FuturesPosition
{
	// 基金
	char fund[32];
	// 单元
	char unit[16];
	// 市场
	char market_no[11];
	// 代码
	char code[32];
	// 多空标志
	char position_flag[4];
	// 总持仓数量
	int current_amount;
	// 总可用数量
	int enable_amount;
	// 今仓数量
	int today_amount;
	// 老仓数量
	int history_amount;
	// 今仓可用数量
	int today_enable_amount;
	// 老仓可用数量
	int history_enable_amount;
	// 开仓挂单数量
	int pre_open_amount;
	// 平仓挂单数量
	int pre_close_amount;
	// 当日买入数量
	int today_buy_amount;
	// 当日卖出数量
	int today_sell_amount;
};

// 期货报单信息
struct FuturesOrder
{
	// 基金
	char fund[32];
	// 单元
	char unit[16];
	// 市场
	char market_no[11];
	// 代码
	char code[32];
	// 交易日
	int trading_day;
	// 报单时间
	int order_time;
	// 委托编号
	int order_system_no;
	// 报单id
	int order_id;
	// 买卖方向
	char direction[4];
	// 开平方向
	char offset_flag[4];
	// 平仓类型
	char close_type[4];
	// 价格类型
	char price_type[4];
	// 报单价格
	double order_price;
	// 报单数量
	int order_amount;
	// 报单状态
	char order_status[4];
	// 冻结金额
	double frozen_balance;
	// 总成交数量
	int total_trade_amount;
	// 成交价格
	double trade_price;
	// 成交金额
	double trade_balance;
	// 撤单数量
	int cancel_amount;
	// 撤单原因
	char cancel_message[256];
};

// 期货成交信息
struct FuturesTrade
{
	// 基金
	char fund[32];
	// 单元
	char unit[16];
	// 市场
	char market_no[11];
	// 代码
	char code[32];
	// 委托编号
	int order_system_no;
	// 报单id
	int order_id;
	// 买卖方向
	char direction[4];
	// 开平方向
	char offset_flag[4];
	// 平仓类型
	char close_type[4];
	// 成交编号
	char trade_no[64];
	// 成交时间
	int trade_time;
	// 成交数量
	int trade_amount;
	// 成交价格
	double trade_price;
	// 成交金额
	double trade_balance;
	// 费用
	double trade_fee;
};

// 期货账户资金信息
struct FuturesAsset
{
	// 基金
	char fund[32];
	// 单元
	char unit[16];
	// 当前权益
	double current_equity;
	// 保证金账户余额
	double current_balance;
	// 可用保证金
	double enable_deposit_balance;
	// 占用保证金（含挂单冻结）
	double occupy_deposit_balance;
	// 挂单冻结保证金
	double frozen_deposit_balance;
	// 期货资产，合约价值
	double futures_asset;
	// 盯市盈亏
	double today_profit;
	// 浮动盈亏
	double float_profit;
	// 平仓盈亏
	double close_profit;
	// 费用
	double fee;
	// 回购资产
	double repo_asset;
	// 期权资产
	double option_asset;
};

// 期权持仓信息
struct OptionPosition
{
	// 基金
	char fund[32];
	// 单元
	char unit[16];
	// 市场
	char market_no[11];
	// 代码
	char code[32];
	// 期权类型
	char option_type[4];
	// 多空标志
	char position_flag[4];
	// 总持仓数量
	int current_amount;
	// 总可用数量
	int enable_amount;
	// 期初成本
	double begin_cost;
	// 当前成本
	double current_cost;
	// 开仓挂单数量
	int pre_open_amount;
	// 平仓挂单数量
	int pre_close_amount;
	// 当日开仓数量
	int today_open_amount;
	// 当日平仓数量
	int today_close_amount;
};

// 期权报单信息
struct OptionOrder
{
	// 基金
	char fund[32];
	// 单元
	char unit[16];
	// 市场
	char market_no[11];
	// 代码
	char code[32];
	// 期权类型
	char option_type[4];
	// 交易日
	int trading_day;
	// 报单时间
	int order_time;
	// 委托编号
	int order_system_no;
	// 报单id
	int order_id;
	// 买卖方向
	char direction[4];
	// 开平方向
	char offset_flag[4];
	// 平仓类型
	char close_type[4];
	// 价格类型
	char price_type[4];
	// 报单价格
	double order_price;
	// 报单数量
	int order_amount;
	// 报单状态
	char order_status[4];
	// 冻结金额
	double frozen_balance;
	// 总成交数量
	int total_trade_amount;
	// 成交价格
	double trade_price;
	// 成交金额
	double trade_balance;
	// 撤单数量
	int cancel_amount;
	// 撤单原因
	char cancel_message[256];
};

// 期权成交信息
struct OptionTrade
{
	// 基金
	char fund[32];
	// 单元
	char unit[16];
	// 市场
	char market_no[11];
	// 代码
	char code[32];
	// 期权类型
	char option_type[4];
	// 委托编号
	int order_system_no;
	// 报单id
	int order_id;
	// 买卖方向
	char direction[4];
	// 开平方向
	char offset_flag[4];
	// 平仓类型
	char close_type[4];
	// 成交编号
	char trade_no[64];
	// 成交时间
	int trade_time;
	// 成交数量
	int trade_amount;
	// 成交价格
	double trade_price;
	// 成交金额
	double trade_balance;
	// 费用
	double trade_fee;
};

// 证券期权账户保证金信息
struct StockOptionAsset
{
	// 基金
	char fund[32];
	// 单元
	char unit[16];
	// 当前权益
	double current_equity;
	// 保证金账户余额
	double current_balance;
	// 可用保证金
	double enable_deposit_balance;
	// 挂单冻结保证金
	double frozen_deposit_balance;
	// 期权资产
	double option_asset;
};

#pragma pack(pop)

typedef void(*OnApiReady)(int reserve);
typedef void(*OnApiNotReady)(int reason);
typedef void(*OnTick)(Tick* tick);
typedef void(*OnKLine)(KLine* kline);
typedef void(*OnOrderInsertResponse)(OrderInsertResponse* order_insert_response);
typedef void(*OnOrderCancelResponse)(OrderCancelResponse* order_cancel_response);
typedef void(*OnOrderReport)(OrderReport* order_report);
typedef void(*OnTradeReport)(TradeReport* trade_report);
typedef void(*OnOrderCancelReport)(OrderCancelReport* cancel_report);

OPLUSWRAPPERAPI_EXPORT int add(int x, int y);

OPLUSWRAPPERAPI_EXPORT void set_callback_on_api_ready(OnApiReady func);
OPLUSWRAPPERAPI_EXPORT void set_callback_on_api_not_ready(OnApiNotReady func);
OPLUSWRAPPERAPI_EXPORT void set_callback_on_tick(OnTick func);
OPLUSWRAPPERAPI_EXPORT void set_callback_on_kline(OnKLine func);
OPLUSWRAPPERAPI_EXPORT void set_callback_on_order_insert_response(OnOrderInsertResponse func);
OPLUSWRAPPERAPI_EXPORT void set_callback_on_order_cancel_response(OnOrderCancelResponse func);
OPLUSWRAPPERAPI_EXPORT void set_callback_on_order_report(OnOrderReport func);
OPLUSWRAPPERAPI_EXPORT void set_callback_on_trade_report(OnTradeReport func);
OPLUSWRAPPERAPI_EXPORT void set_callback_on_order_cancel_report(OnOrderCancelReport func);

OPLUSWRAPPERAPI_EXPORT int init(const char* user, const char* password, const char* report_subscribe_type);
OPLUSWRAPPERAPI_EXPORT bool is_api_ready();
OPLUSWRAPPERAPI_EXPORT int subscribe_tick(const char* market_no, const char* code);
OPLUSWRAPPERAPI_EXPORT int subscribe_kline(const char* market_no, const char* code, int period = 0, int finish = 1);

OPLUSWRAPPERAPI_EXPORT int stock_order_insert(const char* fund, const char* unit, const char* market_no, const char* code, const char* direction, int amount, double price, const char* price_type);
OPLUSWRAPPERAPI_EXPORT int stock_order_cancel(int order_system_no);
OPLUSWRAPPERAPI_EXPORT StockPosition* stock_get_position(int* out_size, const char* fund, const char* unit, const char* market_no = nullptr, const char* code = nullptr);
OPLUSWRAPPERAPI_EXPORT StockOrder* stock_get_orders(int* out_size, const char* fund, const char* unit, const char* market_no = nullptr, const char* code = nullptr, int order_system_no = 0, int order_id = 0);
OPLUSWRAPPERAPI_EXPORT StockTrade* stock_get_trades(int* out_size, const char* fund, const char* unit, const char* market_no = nullptr, const char* code = nullptr, int order_system_no = 0, int order_id = 0);
OPLUSWRAPPERAPI_EXPORT StockAsset* stock_get_asset(int* out_size, const char* fund, const char* unit);

OPLUSWRAPPERAPI_EXPORT int futures_order_insert(const char* fund, const char* unit, const char* market_no, const char* code, const char* direction, const char* offset_flag, const char* close_type, int amount, double price, const char* price_type);
OPLUSWRAPPERAPI_EXPORT int futures_order_cancel(int order_system_no);
OPLUSWRAPPERAPI_EXPORT FuturesPosition* futures_get_position(int* out_size, const char* fund, const char* unit, const char* market_no = nullptr, const char* code = nullptr);
OPLUSWRAPPERAPI_EXPORT FuturesOrder* futures_get_orders(int* out_size, const char* fund, const char* unit, const char* market_no = nullptr, const char* code = nullptr, int order_system_no = 0, int order_id = 0);
OPLUSWRAPPERAPI_EXPORT FuturesTrade* futures_get_trades(int* out_size, const char* fund, const char* unit, const char* market_no = nullptr, const char* code = nullptr, int order_system_no = 0, int order_id = 0);
OPLUSWRAPPERAPI_EXPORT FuturesAsset* futures_get_asset(int* out_size, const char* fund, const char* unit);

OPLUSWRAPPERAPI_EXPORT int option_order_insert(const char* fund, const char* unit, const char* market_no, const char* code, const char* direction, const char* offset_flag, const char* close_type, int amount, double price, const char* price_type, const char* third_ref = nullptr);
OPLUSWRAPPERAPI_EXPORT int option_order_cancel(int order_system_no);
OPLUSWRAPPERAPI_EXPORT int option_exercise_order_insert(const char* fund, const char* unit, const char* market_no, const char* code, const char* direction, int amount);
OPLUSWRAPPERAPI_EXPORT int option_exercise_order_cancel(int order_system_no);
OPLUSWRAPPERAPI_EXPORT OptionPosition* option_get_position(int* out_size, const char* fund, const char* unit, const char* market_no = nullptr, const char* code = nullptr);
OPLUSWRAPPERAPI_EXPORT OptionOrder* option_get_orders(int* out_size, const char* fund, const char* unit, const char* market_no = nullptr, const char* code = nullptr, int order_system_no = 0, int order_id = 0);
OPLUSWRAPPERAPI_EXPORT OptionTrade* option_get_trades(int* out_size, const char* fund, const char* unit, const char* market_no = nullptr, const char* code = nullptr, int order_system_no = 0, int order_id = 0);
OPLUSWRAPPERAPI_EXPORT StockOptionAsset* stock_option_get_asset(int* out_size, const char* fund, const char* unit);

OPLUSWRAPPERAPI_EXPORT void free_api_memory(void* ptr);